package com.server.socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import com.server.function.FunInterface;

/**服务器连接部分的框架，实际的服务器逻辑只需要接口实现然后作为参数传入即可
 *
 */
public class ServerFunction implements Runnable{
	private int port;	//端口号
	private FunInterface fun;	//功能接口，逻辑需要实现
	private Socket socket;	//类内使用的socket
	private ServerSocket server;	//serverSocket
	private DataOutputStream dos;	//输出流
	private DataInputStream dis;	//输入流

	/**通过端口和实现了接口的类来实例化一个服务器类
	 *
	 * @param port 服务端口
	 * @param fun	服务逻辑
	 */
	public ServerFunction(int port,FunInterface fun) {
		this.port=port;
		this.fun=fun;
	}

	@Override
	public void run() {
		try{
			server=new ServerSocket(port);	//新建serverSocket
			while(true){
				socket=server.accept();	//等待客户端请求
				dis=new DataInputStream(socket.getInputStream());	//新建一个输入流
				String request=dis.readUTF();	//从客户端读取数据
				String response=fun.deal(request);	//处理客户端发来的数据，并获取处理后的输出
				dos=new DataOutputStream(socket.getOutputStream());	//新建一个输出流
				dos.writeUTF(response);	//发送回复到客户端
				dos.flush();	//每次处理完毕都要关闭相应的端口
				dos.close();
				dis.close();
				socket.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				server.close();	//关闭响应的端口，防止服务异常停止端口被占用
				socket.close();
				dos.close();
				dis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}